const cloud = require('wx-server-sdk')
const got = require('got')
const iconv = require('iconv-lite')

cloud.init({
  env: cloud.DYNAMIC_CURRENT_ENV
})

// 请求头配置
const headers = {
  'Referer': 'https://finance.sina.com.cn',
  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
  'Accept': '*/*',
  'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
  'Accept-Encoding': 'gzip, deflate, br',
  'Connection': 'keep-alive',
  'Host': 'hq.sinajs.cn'
}

// 处理股票搜索
async function searchStocks(keyword) {
  console.log('开始搜索股票，关键词：', keyword)
  try {
    // 使用新浪股票搜索接口
    const url = `https://suggest3.sinajs.cn/suggest/key=${encodeURIComponent(keyword)}`
    console.log('请求URL：', url)
    
    const response = await got(url, {
      headers: {
        ...headers,
        'Host': 'suggest3.sinajs.cn'
      },
      timeout: 10000,  // 增加超时时间到10秒
      retry: 0,  // 禁用重试以节省时间
      responseType: 'buffer'
    })
    
    // 将GBK编码的Buffer转换为UTF-8字符串
    const body = iconv.decode(response.body, 'GBK')
    
    // 解析返回的数据
    const data = body.replace('var suggestvalue="', '').replace('";', '')
    if (!data) {
      console.log('没有搜索到股票')
      return { stocks: [] }
    }

    // 解析股票数据
    const stocks = data.split(';')
      .filter(item => item && item.trim())
      .map(item => {
        const parts = item.split(',')
        if (parts.length < 5) return null
        
        const code = parts[2]
        // 只返回 A 股
        if (!code.match(/^(600|601|603|000|002|300)\d{3}$/)) {
          return null
        }

        return {
          code,
          name: parts[4],
          type: code.startsWith('6') ? 'sh' : 'sz'
        }
      })
      .filter(item => item !== null)
      .slice(0, 10)  // 限制返回数量，加快处理速度
    
    console.log('搜索完成，找到股票数量：', stocks.length)
    return { stocks }
  } catch (error) {
    console.error('搜索股票失败：', error.message)
    return { 
      error: '搜索失败：' + error.message,
      stocks: []  // 即使失败也返回空数组而不是null
    }
  }
}

// 处理实时行情
async function getRealTimeData(code) {
  console.log('开始获取实时数据，股票代码：', code)
  try {
    const fullCode = code.startsWith('6') ? `sh${code}` : `sz${code}`
    const url = `https://hq.sinajs.cn/list=${fullCode}?_=${Date.now()}`
    console.log('请求URL：', url)
    
    const response = await got(url, {
      headers,
      timeout: 5000,
      retry: {
        limit: 2,
        methods: ['GET']
      }
    })
    
    console.log('新浪接口原始响应：', response.body)
    
    const data = response.body
    const match = data.match(/=\"(.*?)\"/)
    if (!match) {
      console.error('数据格式不正确')
      return { error: '获取数据失败：数据格式不正确' }
    }

    const values = match[1].split(',')
    if (values.length < 32) {
      console.error('数据不完整')
      return { error: '获取数据失败：数据不完整' }
    }

    const price = parseFloat(values[3])
    const preClose = parseFloat(values[2])
    const change = price - preClose
    
    const result = {
      data: {
        name: values[0],
        code: code,
        price: price.toFixed(2),
        preClose: preClose.toFixed(2),
        change: change.toFixed(2),
        changePercent: ((change / preClose) * 100).toFixed(2),
        high: values[4],
        low: values[5],
        volume: (parseFloat(values[8]) / 100).toFixed(0), // 转换为手
        amount: (parseFloat(values[9]) / 10000).toFixed(2), // 转换为万元
        date: values[30],
        time: values[31],
        open: values[1],
        bid: [
          { price: values[11], volume: values[10] },
          { price: values[13], volume: values[12] },
          { price: values[15], volume: values[14] },
          { price: values[17], volume: values[16] },
          { price: values[19], volume: values[18] }
        ],
        ask: [
          { price: values[21], volume: values[20] },
          { price: values[23], volume: values[22] },
          { price: values[25], volume: values[24] },
          { price: values[27], volume: values[26] },
          { price: values[29], volume: values[28] }
        ]
      }
    }
    
    console.log('处理后的数据：', result)
    return result
  } catch (error) {
    console.error('获取实时数据失败，详细错误：', error)
    return { error: '获取数据失败：' + error.message }
  }
}

// 获取K线数据
async function getKLineData(code) {
  console.log('开始获取K线数据，股票代码：', code)
  try {
    const fullCode = code.startsWith('6') ? `sh${code}` : `sz${code}`
    const url = `https://money.finance.sina.com.cn/quotes_service/api/json_v2.php/CN_MarketData.getKLineData?symbol=${fullCode}&scale=240&ma=5&datalen=60&_=${Date.now()}`
    console.log('请求URL：', url)
    
    const response = await got(url, {
      headers: {
        ...headers,
        'Host': 'money.finance.sina.com.cn',
        'Referer': `https://finance.sina.com.cn/realstock/company/${fullCode}/nc.shtml`
      },
      timeout: 5000,
      retry: {
        limit: 2,
        methods: ['GET']
      }
    })
    
    console.log('新浪接口原始响应：', response.body)
    
    let data = []
    try {
      data = JSON.parse(response.body)
    } catch (e) {
      console.error('解析K线数据失败：', e)
      return { error: '数据格式错误' }
    }
    
    if (!Array.isArray(data)) {
      console.error('K线数据不是数组')
      return { error: '数据格式错误' }
    }
    
    const klineData = data.map(item => ({
      date: item.day,
      open: parseFloat(item.open),
      high: parseFloat(item.high),
      low: parseFloat(item.low),
      close: parseFloat(item.close),
      volume: parseInt(item.volume),
      ma5: parseFloat(item.ma_5)
    }))
    
    console.log('处理后的K线数据：', klineData)
    return { data: klineData }
  } catch (error) {
    console.error('获取K线数据失败，详细错误：', error)
    return { error: '获取数据失败：' + error.message }
  }
}

// 云函数入口函数
exports.main = async (event, context) => {
  console.log('云函数收到的参数：', event)
  const { action, params } = event
  
  switch (action) {
    case 'search':
      return await searchStocks(params.keyword)
    case 'realtime':
      return await getRealTimeData(params.code)
    case 'kline':
      return await getKLineData(params.code)
    default:
      console.error('未知的操作类型：', action)
      return { error: '未知的操作类型' }
  }
}